export default {
  getRequiredRule(name) {
    return {
      required: true,
      message: `${name}不能为空`
    }
  },
  getPositiveIntegerRules(name) {
    return [
      {
        type: 'integer',
        message: `${name}只能为正整数`
      }, {
        validator: (rule, value, callback) => {
          if (parseInt(value) <= 0) {
            return callback(new Error(`${name}只能为正整数1`))
          }
          return callback()
        }
      }
    ]
  },
  name: [
    {
      type: 'string',
      min: 2,
      max: 10,
      message: '姓名需在2 - 10个字符之间'
    }
  ],
  mobile: [
    {
      type: 'string',
      pattern: /^(?:(?:\+|00)86)?1[3-9]\d{9}$/,
      message: '手机号不符合规范'
    }
  ],
  username: [
    {
      type: 'string',
      pattern: /^[a-zA-Z0-9_-]{5,15}$/,
      message: '用户名长度应在5 - 15位之间且只能由字母、数字、下划线和减号组成'
    }
  ],
  birthday: [
    {
      type: 'string',
      pattern: /^\d{4}(-)(1[0-2]|0?\d)\1([0-2]\d|\d|30|31)$/,
      message: '出生日期不符合规则'
    }
  ],
  password: [
    {
      type: 'string',
      message: '密码应在5 - 20位之间，且要包含数字和字母',
      pattern: /^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{5,20}$/
    }
  ],
  idcard: [
    {
      type: 'string',
      len: 18,
      message: '身份证号长度需为18位'
    },
    {
      validator: (rule, idCard, callback) => {
        // 15位和18位身份证号码的正则表达式
        const regIdCard = /^(^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$)|(^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])((\d{4})|\d{3}[Xx])$)$/
        // 如果通过该验证，说明身份证格式正确，但准确性还需计算
        if (regIdCard.test(idCard)) {
          if (idCard.length === 18) {
            const idCardWi = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]// 将前17位加权因子保存在数组里
            const idCardY = [1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2]// 这是除以11后，可能产生的11位余数、验证码，也保存成数组
            let idCardWiSum = 0// 用来保存前17位各自乖以加权因子后的总和
            for (let i = 0; i < 17; i++) {
              idCardWiSum += idCard.substring(i, i + 1) * idCardWi[i]
            }
            const idCardMod = idCardWiSum % 11// 计算出校验码所在数组的位置
            const idCardLast = idCard.substring(17)// 得到最后一位身份证号码
            // 如果等于2，则说明校验码是10，身份证号码最后一位应该是X
            const isValidated = idCardMod === 2 ? idCardLast.toLowerCase() == 'x' : idCardLast == idCardY[idCardMod]
            if (isValidated) {
              return callback()
            }
            return callback(new Error('身份证号不符合规则'));
          }
        } else {
          return callback(new Error('身份证长度需为18位'));
        }
      }
    }
  ]
}
